package it.ap.sa.core.utils;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component("coreProperty")
@PropertySource( value = {"classpath:config.properties"} )
public class CoreProperties {
	

/** =============================================================================== **/
	
	/*  PROXY CONNECTION PROPERTIES */
   
	public @Value("${proxyActive}")
	boolean proxyActive;
			 
	public @Value("${proxyHost}")
	String proxyHost;
		    
	public @Value("${proxyPort}")
	int proxyPort;
		    
	public @Value("${proxyPassword}")
	String proxyPassword;
		    
	public @Value("${proxyUsername}")
	String proxyUsername;
		    
	public @Value("${nonProxyHosts:localhost}")
	String nonProxyHosts;
	
	
/** =============================================================================== **/
	
	/*  SECURITY PROPERTIES */
	
/** =============================================================================== **/
	
	/* DATABASE PROPERTIES */
   	
	/*
	 *  The db url.
	 */
	public @Value("${jdbc.url}")
	String jdbcUrl;
	
	/*
	 *  The db driver.
	 */
	public @Value("${jdbc.driver}")
	String jdbcDriver;
	
	/*
	 *  The db user.
	 */
	public @Value("${jdbc.username}")
	String jdbcUsername;
	
	/*
	 *  The db password.
	 */
	public @Value("${jdbc.password}")
	String jdbcPassword;
	
	/*
	 *  The db datasource class.
	 */
	public @Value("${jdbc.datasourceClass:it.eng.tz.core.dao.datasource.ExtendBasicDataSource}")
	String jdbcDatasourceClass;
	
/** =============================================================================== **/
	
	/* LOGGER PROPERTIES - Utente autenticato non trovato */
   
	/*
	 *  True o false a seconda se si vuole lanciare l'eccezzione quando non viene trovato l'utente autenticato
	 */
	public @Value("${revision.launch.exception.username:true}")
	boolean revisionLaunchExceptionUsername;
			 
	/*
	 *  Messaggio dell'eccezione in caso di utente autenticato non trovato
	 */
	public @Value("${revision.exception.message:Unrecognized principal while getting the current user}")
	String revisionExceptionMessage;
	
	/*
	 *  Stringa di default da usare come username nella revision entity quando non viene trovato l'utente autenticato
	 */
	public @Value("${revision.default.username:anonymous}")
	String revisionDefaultUsername;
	
	/** =============================================================================== **/

	/* GESTORE POLICY */
	
	/*
	 * Indica se l'applicazione deve verificare allo startup e ad ogni chiamata request le policy attive 
	 */
	public @Value("${POLICY_HAS_CHECK}")  
	Boolean POLICY_HAS_CHECK;
	
	/*
	 * Classe che implementa la procedura di caricamento delle policy, attive, in memoria dell'applicazione.
	 * Indicare la classe comprensiva di package.
	 */
	public @Value("${POLICY_LOADER_CLASS}")  
	String POLICY_LOADER_CLASS;
	
	/*
	 * Pagina alla quale l'utente deve essere reindirizzato quando viene se richiede il logout forzato
	 */
	public @Value("${POLICY_REDIRECT_URL_LOGOUT}")  
	String POLICY_REDIRECT_URL_LOGOUT;
	
	/*
	 * Pagina alla quale l'utente deve essere reindirizzato per cambiare la password
	 */
	public @Value("${POLICY_REDIRECT_URL_CH_PASSWORD}")  
	String POLICY_REDIRECT_URL_CH_PASSWORD;
	
	/*
	 * Nome topic su cui mettersi in ascolto per l'invio e la ricezione di notifiche policy
	 */
	public @Value("${POLICY_TOPIC_NAME}")  
	String POLICY_TOPIC_NAME;
	
	/*
	 * The client identifier (short ClientId) is an identifier of each MQTT client connecting to a MQTT broker.
	 */
	public @Value("${POLICY_MQTT_CLIENT_ID}")  
	String POLICY_MQTT_CLIENT_ID;
	
	
/** =============================================================================== **/
	
	/*  AUDIT4J PROPERTIES */
   	
	/*
	 *  The db connection type.
	 */
	public @Value("${audit4j.db.connection.type}")
	String audit4jDbConnectionType;
	
	/*
	 *  The table prefix.
	 */
	public @Value("${audit4j.table.prefix}")
	String audit4jDbPrefix;
	
	/*
	 *  The table suffix.
	 */
	public @Value("${audit4j.table.suffix}")
	String audit4jDbSuffix;
	
/** =============================================================================== **/
	
	/* PRAMETRI DI CONFIGURAZIONE DELL'APPLICAZIONE OBBLIGATORI */
   		
	/*
	 *  codice applicazione
	 */
	public @Value("${CODE_APP:null}")
	String CODE_APP;
	
	/*
	 *  Reader(database o file) che determina da dove leggere i parametri di configurazione dell'applicazione.
	 *  Indicare la classe comprensiva di package.
	 *     - it.eng.tz.core.configuration.reader.ConfigurationDBReader --->> Lettura parametri da DB.
	 *     - it.eng.tz.core.configuration.reader.ConfigurationFilePropertyReader --->> Lettura parametri da file.
	 */
	public @Value("${CONFIG_READER:it.eng.tz.core.configuration.reader.ConfigurationFilePropertyReader}")
	String CONFIG_READER;
	
	/*
	 * Stringa utilizzata per recuperare dal configuration la lista di logger. 
	 */
	public @Value("${prefixLogger:logger}")
	String prefixLogger;
	
	/*
	 *  File di properties dell'applicazione.
	 */
	public @Value("${defaultConfigurationFile:config.properties}")
	String defaultConfigurationFile;
	
/** =============================================================================== **/
	
	/* PRAMETRI DI CONFIGURAZIONE DELL'APPLICAZIONE OPZIONALE */
		
	/*
	 *  File alternativo da cui il reader leggerà i parametri di configurazione dell'applicazione.
	 *  Indicare il nome file comprensivo di estensione.
	 *  Se non valorizzato, il reader su file leggerà i parametri dal file di properties "config.properties".
	 */
	public @Value("${configurationFile}")
	String configurationFile;
	
	
/** =============================================================================== **/
	
	/* AUDIT WRITE LOGGER */
	
	/*
	 * Writer(database o file) col quale archiviare i log prodotti con Audit4j. Indicare la classe comprensiva di package.
	 */ 
	public @Value("${AUDIT_WRITER_CLASS:it.eng.tz.core.audit.config.Audit4JWriter}")
	String AUDIT_WRITER_CLASS;
	
	/* AUDIT con LOGBACK PROPERTIES */
	
	/*
	 *  Nome del logger da usare per scrivere audit con logback.
	 */
	public @Value("${audit.logback.logger:AUDIT_LOGGER}")
	String audit_logback_logger;
	
	/*
	 *  Nome dell'appender.
	 */
	public @Value("${audit.logback.appender:AUDIT_APPENDER}")
	String audit_logback_appender;
	
	/*
	 *  Determina se il log prodotto dal logger di Audit deve essere scritto anche dal root logger.
	 */
	public @Value("${audit.logback.additivity:false}")
	Boolean audit_logback_additivity;
	
	/*
	 *  Stabilisce il levello di log per logback. I valori possibili sono: INFO, DEBUG, WARN, ERROR. 
	 */
	public @Value("${audit.logback.level:DEBUG}")
	String audit_logback_level;
	
	/*
	 *  Path della cartella dove archiviare i file di log prodotti da audit con logback.
	 */
	public @Value("${audit.logback.path.file:${catalina.home}/logs/Smartmob/Audit/}")
	String audit_logback_path_file;
	
	/*
	 *  Nome del file di log non comprensivo di estensione. Es: audit, ecc..
	 */
	public @Value("${audit.logback.filename:audit}")
	String audit_logback_filename;
	
	/*
	 *  La proprietà fileNamePattern è obbligatoria perchè il periodo di rollover viene dedotto dal suo valore. 
	 *  Il suo valore dovrebbe consistere nel specificare il formato di "%d". 
	 *  Lo specificatore "%d" può contenere un modello di data e ora, come specificato dalla classe java.text.SimpleDateFormat. 
	 *  ES: %d{yyyy-MM-dd} , rollover giornaliero
	 */
	public @Value("${audit.logback.filename.pattern:%d{yyyy-MM-dd}}")
	String audit_logback_filename_pattern;
	
	/*
	 *  Se il file di log cresce più grande della dimensione specificata, viene fatto scattare il rollover del file attivo esistente.
	 *  L'opzione può essere specificata in byte, kilobyte, megabyte o gigabyte scritto come: KB, MB e GB.
	 *  Ad esempio, 5000000, 5000 KB, 5 MB e 2 GB sono tutti valori validi.
	 */
	public @Value("${audit.logback.maxfilesize:250MB}")
	String audit_logback_maxfilesize;
			
	/*
	 *  Layout del file di log.
	 *  Es: %X{codeApp} | %X{sessionId} | %X{username} | %d{yyyy-MM-dd HH:mm:ss} | %-5level | %C | %msg%n
	 */
	public @Value("${audit.logback.pattern:%d{dd/MM/yyyy HH:mm:ss}|%X{username}|%X{codeApp}|%msg%n}")
	String audit_logback_pattern;
	
/** =============================================================================== **/
	
	/* DEFAULT LOGBACK PROPERTIES - Console appender */
	
	/* 
	 *  Nome dell'appender
	 */
	public @Value("${logback.console.appender:console}")
	String logback_console_appender;
	
	/* 
	 *  Layout del file di log.
	 *  Es: %X{codeApp} | %X{sessionId} | %X{username} | %d{yyyy-MM-dd HH:mm:ss} | %-5level | %C | %msg%n
	 */
	public @Value("${logback.console.pattern:%d{yyyy-MM-dd HH:mm:ss} | %X{sessionId} | %X{username} | %-5level | %C | %msg %n}")
	String logback_console_pattern;

	/*
	 *  Stabilisce il levello di log per logback. I valori possibili sono: INFO, DEBUG, WARN, ERROR. 
	 */
	public @Value("${logback.console.level:DEBUG}")
	String logback_console_level;
	
/** =============================================================================== **/
	
	/*  SECURITY PROPERTIES */
	
	/*
	 *  Opzione che permette di bypassare l'autenticazione utente su db
	 */
	public @Value("${SKIP_UTENTE_LOGGATO}")
	boolean SKIP_UTENTE_LOGGATO;
	
/** =============================================================================== **/
	/*  IMAGE */
	public @Value("${FISH_IMAGE_URL}")
	String FISH_IMAGE_URL;
	
	public @Value("${FISH_IMAGE_EXT}")
	String FISH_IMAGE_EXT;	
	
/** =============================================================================== **/
	/*  PLANT */
	public @Value("${PLANT_IMAGE_URL}")
	String PLANT_IMAGE_URL;
	
	public @Value("${PLANT_IMAGE_EXT}")
	String PLANT_IMAGE_EXT;		
}
